package com.atguigu.gmall.search.vo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 自定义类的属性名设计：
 *      1.如果字段和数据库表有交互使用表的实体类的属性名
 *      2.一个实体类中有多张表，为了区分不同表的同名字段，使用表名做前缀
 *      3.如果字段不喝数据库交互 需要和前端页面进行交互，需要和前端一起设计商量
 *
 * Goods类中的数据需要和数据库交互，前端展示也要用，所以设计时需要 前端、技术经理、后端一起设计
 */
@Data
@Document(indexName = "goods" ,shards = 3,replicas = 2) //创建索引库goods，3个分片，2个备份
public class Goods {

    //1.sku表中的数据             sku表
    @Id
    private Long skuId;//因为一个Goods就对应一个Sku，所以我们大胆的将skuId作为good的Id
    @Field(type = FieldType.Keyword)//keyword表示不用分词，将其作为一个完整的词条进行存储
    private String defaultImage;
    @Field(type = FieldType.Text , analyzer = "ik_max_word")//FieldType.Text 必须制定analyzer进行分词，因为它是标题
    private String title;
    @Field(type = FieldType.Keyword)//value = "subtitle" 别省略了，不写默认和属性名一致
    private String subtitle;
    @Field(type = FieldType.Double)
    private Double price;

    //2、排序相关                    wms_ware_sku表，spu表，
    @Field(type = FieldType.Long)
    private Long sales = 0L;
    // DateFormat.date : yyyy-MM-dd
    @Field(type = FieldType.Date , format = DateFormat.date) // FieldType.Date 必须指定时间日期格式
    private Date createTime;
    @Field(type = FieldType.Boolean)
    private Boolean store = false;

    //3、sku的品牌                brand表
    @Field(type = FieldType.Long)
    private Long brandId;
    @Field(type = FieldType.Keyword)
    private String brandName;
    @Field(type = FieldType.Keyword)
    private String logo;

    //4、sku的分类                category表
    @Field(type = FieldType.Long)
    private Long categoryId;
    @Field(type = FieldType.Keyword)
    private String categoryName;

    //3、检索属性(里面有部分sku属性也有部分spu属性)     sku_attr_value表，spu_attr_value表
    @Field(type = FieldType.Nested) //不能用FieldType.Object，如果用它，会导致数据扁平化。记住，以后javabean往es里存数据时，一个属性，包含多个值时，用Nested
    List<SearchAttrVo> searchAttrs;
}






